CSS @export์ ๋ํ ์ข ํฉ ๊ฐ์ด๋. ์ต์ ์น ๊ฐ๋ฐ์์ CSS ์คํ์ผ ๋ชจ๋์ ๋ชจ๋์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํค๋ ๋ฌธ๋ฒ, ์ฌ์ฉ ์ฌ๋ก, ์ด์ ์ ํ๊ตฌํฉ๋๋ค.
CSS @export: ์ต์ ์น ๊ฐ๋ฐ์ ์ํ ์คํ์ผ ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ์๋ฒฝ ํด๋ถ
๋์์์ด ๋ฐ์ ํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ง๋ณด์์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. CSS ์คํ์ผ ๋ชจ๋์ ์ปดํฌ๋ํธ ๋ด์ ์คํ์ผ์ ์บก์ํํ์ฌ ์ ์ญ ๋ค์์คํ์ด์ค ์ค์ผ์ ๋ฐฉ์งํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๋๋ก๋ ํ ๋ชจ๋์์ ๋ค๋ฅธ ๋ชจ๋๋ก ํน์ ์คํ์ผ์ด๋ ๊ฐ์ ๋
ธ์ถํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์ด๋ CSS ์คํ์ผ ๋ชจ๋์ @export ๊ท์น์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ @export์ ๋ณต์กํ ๋ด์ฉ๋ค์ ๊น์ด ํ๊ณ ๋ค์ด ๋ฌธ๋ฒ, ์ฌ์ฉ ์ฌ๋ก, ์ด์ ๋ฐ CSS์ ๋ชจ๋์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ์ด๋ป๊ฒ ํฅ์์ํค๋์ง ํ๊ตฌํ ๊ฒ์
๋๋ค.
CSS ์คํ์ผ ๋ชจ๋์ด๋ ๋ฌด์์ธ๊ฐ์?
@export์ ๋ํด ์์๋ณด๊ธฐ ์ ์ CSS ์คํ์ผ ๋ชจ๋์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ํด๋์ค ์ด๋ฆ๊ณผ ์ ๋๋ฉ์ด์
์ด๋ฆ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก์ปฌ ๋ฒ์๋ก ์ง์ ๋๋ CSS ํ์ผ์
๋๋ค. ์ฆ, ํ ๋ชจ๋์ ์ ์๋ ํด๋์ค ์ด๋ฆ์ ๊ฐ์ ์ด๋ฆ์ ๊ณต์ ํ๋๋ผ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ ์๋ ํด๋์ค ์ด๋ฆ๊ณผ ์ถฉ๋ํ์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฉ๋ฆฌ๋ ํด๋์ค ์ด๋ฆ์ด ํ์ผ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ ํด์๋ฅผ ์ถ๊ฐํ๋ ๋ฑ ๊ณ ์ ํ ์๋ณ์๋ก ๋ณํ๋๋ ์๋ ์ด๋ฆ ๋งน๊ธ๋ง(name mangling)์ ํตํด ๋ฌ์ฑ๋ฉ๋๋ค.
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
/* button.module.css */
.button {
background-color: #4CAF50; /* Green */
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
cursor: pointer;
}
/* JavaScript */
import styles from './button.module.css';
function Button() {
return ;
}
export default Button;
์ด ์์ ์์ button.module.css ํ์ผ์ .button ํด๋์ค์ ๋ํ ์คํ์ผ์ ์ ์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ styles.button์ button_button__34567๊ณผ ๊ฐ์ ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ผ๋ก ํ์ธ๋ฉ๋๋ค. ์ด๋ ์คํ์ผ๋ง ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ๋ฒํผ์ ๋ชจ์์ด ์ผ๊ด๋๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
@export ๊ท์น ์๊ฐ
@export ๊ท์น์ ์ฌ์ฉํ๋ฉด CSS ๋ณ์(์ฌ์ฉ์ ์ง์ ์์ฑ)๋ ์ ์ฒด ํด๋์ค ์ด๋ฆ๊ณผ ๊ฐ์ ํน์ ๊ฐ์ CSS ์คํ์ผ ๋ชจ๋์์ ๋ช
์์ ์ผ๋ก ๋
ธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ญ ์คํ์ผ์ ์์กดํ์ง ์๊ณ ๋ชจ๋ ๊ฐ์ ์คํ์ผ๋ง ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ณ ์ ํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
๋ฌธ๋ฒ
@export ๊ท์น์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
@export {
<exported-name>: <value>;
<exported-name>: <value>;
/* ... more exports */
}
@export: ๋ด๋ณด๋ด๊ธฐ ๋ธ๋ก์ ์์ํ๋ ํค์๋์ ๋๋ค.<exported-name>: ๊ฐ์ด ๋ด๋ณด๋ด์ง ์ด๋ฆ์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋์์ ๊ฐ์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋ ์๋ณ์์ ๋๋ค.<value>: ๋ด๋ณด๋ด๋ ๊ฐ์ ๋๋ค. ์ด๋ CSS ๋ณ์, ํด๋์ค ์ด๋ฆ ๋๋ ๋ค๋ฅธ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ณ์ฐ์ด ๋ ์ ์์ต๋๋ค.
CSS ๋ณ์(์ฌ์ฉ์ ์ง์ ์์ฑ) ๋ด๋ณด๋ด๊ธฐ
@export์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ CSS ๋ณ์๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ํตํด ํ
๋ง ๊ด๋ จ ๊ฐ์ ์ค์ ๋ชจ๋์ ์ ์ํ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ :
/* theme.module.css */
:root {
--primary-color: #007bff; /* Blue */
--secondary-color: #6c757d; /* Grey */
--font-size-base: 16px;
}
@export {
primaryColor: var(--primary-color);
secondaryColor: var(--secondary-color);
fontSizeBase: var(--font-size-base);
}
/* component.module.css */
@import theme from './theme.module.css';
.component {
color: theme.primaryColor;
font-size: theme.fontSizeBase;
}
์ด ์์ ์์ theme.module.css ํ์ผ์ ์ฌ๋ฌ CSS ๋ณ์๋ฅผ ์ ์ํ๊ณ @export๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋
๋๋ค. ๊ทธ๋ฐ ๋ค์ component.module.css ํ์ผ์ ์ด๋ฌํ ๋ณ์๋ค์ ๊ฐ์ ธ์ .component ํด๋์ค์ ์คํ์ผ์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. CSS ๋ชจ๋์ ํนํ๋ @import theme from './theme.module.css'; ๋ฌธ๋ฒ๊ณผ ๋ณ์๊ฐ theme.variableName์ ์ฌ์ฉํ์ฌ ์ ๊ทผ๋๋ ๋ฐฉ์์ ์ฃผ๋ชฉํ์ธ์.
์ค๋ช :
:root๊ฐ์ ํด๋์ค๋ ์ ์ญ CSS ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก๋ ์ ์ญ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ง, ์คํ์ผ ๋ชจ๋ ์ปจํ ์คํธ ๋ด์์ ์ฌ์ฉํ๊ณ ๋ด๋ณด๋ด๋ฉด ๋ ๋์ ์ ์ด์ ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค.@export๋ธ๋ก์ CSS ๋ณ์๋ฅผ ์๋ก์ด ์ด๋ฆ(primaryColor,secondaryColor,fontSizeBase)์ผ๋ก ๋ ธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ ์คํ์ผ์์ ๋ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.@import๋ฌธ์theme.module.css์์ ๋ด๋ณด๋ธ ๊ฐ์component.module.cssํ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.theme.primaryColor๋ฌธ๋ฒ์component.module.cssํ์ผ ๋ด์์ ๋ด๋ณด๋ธ CSS ๋ณ์์ ์ ๊ทผํฉ๋๋ค.
ํด๋์ค ์ด๋ฆ ๋ด๋ณด๋ด๊ธฐ
CSS ๋ณ์๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ๋ณด๋ค ๋ ์ผ๋ฐ์ ์ด์ง๋ง, @export๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ํด๋์ค ์ด๋ฆ์ ๋ด๋ณด๋ผ ์๋ ์์ต๋๋ค. ์ด๋ ํ ๋ชจ๋์ ํน์ ์คํ์ผ์ ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
์์ :
/* alert.module.css */
.alert {
padding: 10px;
border: 1px solid transparent;
border-radius: 4px;
}
.alertSuccess {
color: #3c763d;
background-color: #dff0d8;
border-color: #d6e9c6;
}
@export {
alert: alert;
alertSuccess: alertSuccess;
}
/* notification.module.css */
@import alertStyles from './alert.module.css';
.notification {
/* Additional styles for the notification container */
}
.notificationSuccess {
extend: alertStyles.alertSuccess all;
/* More Specific Styles Here */
}
์ด ์์ ์์ alert.module.css ํ์ผ์ ๊ธฐ๋ณธ ๊ฒฝ๊ณ ๋ฉ์์ง์ ์ฑ๊ณต ๊ฒฝ๊ณ ๋ฉ์์ง์ ๋ํ ์คํ์ผ์ ์ ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ @export๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ํด๋์ค ์ด๋ฆ์ ๋ด๋ณด๋
๋๋ค. notification.module.css๋ ์ด๋ฌํ ์คํ์ผ์ ๊ฐ์ ธ์ต๋๋ค. extend ์ง์์ด๋ฅผ ์ฌ์ฉํ๋ฉด .notificationSuccess์ ์คํ์ผ์ด .alertSuccess์ ์๋ ๊ท์น๊ณผ ๋์ผํ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ๋ณธ์ง์ ์ผ๋ก ๋งํ๋ ๊ฒ์
๋๋ค. ์ด๋ CSS๋ฅผ ๋ DRY(Don't Repeat Yourself)ํ๊ฒ ๋ง๋ญ๋๋ค.
์ค๋ช :
alert.module.cssํ์ผ์.alert๋ฐ.alertSuccessํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.@export๋ธ๋ก์ ์ด๋ฌํ ํด๋์ค ์ด๋ฆ์ ๋์ผํ ์ด๋ฆ(alert,alertSuccess)์ผ๋ก ๋ด๋ณด๋ ๋๋ค.@import๋ฌธ์alert.module.css์์ ๋ด๋ณด๋ธ ํด๋์ค ์ด๋ฆ์notification.module.cssํ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.extend์ง์์ด๋.alertSuccess์ ์คํ์ผ์ ์์๋ฐ์.notificationSuccess์ ์ ์ฉํฉ๋๋ค.
CSS ๋ณ์์ ํด๋์ค ์ด๋ฆ ๊ฒฐํฉํ๊ธฐ
๋์ผํ @export ๋ธ๋ก์์ CSS ๋ณ์์ ํด๋์ค ์ด๋ฆ์ ๊ฒฐํฉํ ์๋ ์์ต๋๋ค.
/* base.module.css */
:root {
--base-font-size: 14px;
}
.baseStyle {
font-family: sans-serif;
font-size: var(--base-font-size);
}
@export {
baseFontSize: var(--base-font-size);
baseStyle: baseStyle;
}
@export ์ฌ์ฉ์ ์ด์
CSS ์คํ์ผ ๋ชจ๋์์ @export๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ด ์์ต๋๋ค:
- ๋ชจ๋์ฑ ํฅ์: ๋ช ํํ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ง ์ ์ ์๋ ๋ชจ๋์ ๋ง๋ค ์ ์๊ฒ ํ์ฌ ๋ ๋์ ๊ตฌ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ด์งํฉ๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ ๊ฐํ: ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์คํ์ผ๊ณผ ๊ฐ์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํ์ฌ ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ผ๊ด์ฑ์ ํฅ์์ํต๋๋ค.
- ์ ์ญ ๋ค์์คํ์ด์ค ์ค์ผ ๊ฐ์: ํ์ํ ์คํ์ผ๊ณผ ๊ฐ๋ง ๋ด๋ณด๋์ผ๋ก์จ ์ด๋ฆ ์ถฉ๋ ๋ฐ ์๋ํ์ง ์์ ์คํ์ผ ๋ฎ์ด์ฐ๊ธฐ์ ์ํ์ ์ต์ํํฉ๋๋ค.
- ๋ ๋์ ํ ๋ง ์ง์: ํ ๋ง ๊ด๋ จ ๋ณ์๋ฅผ ์ค์ ์์น์ ์ ์ํ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๋ฐฐํฌํ ์ ์๊ฒ ํ์ฌ ํ ๋ง ์์ฑ ๋ฐ ๊ด๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํฉ๋๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ ์ฆ๊ฐ: ์คํ์ผ์ ๋ชจ๋ ๋ด์ ๊ฒฉ๋ฆฌํ์ฌ CSS๋ฅผ ๋ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ์ผ๋ง๋์๋์ง ํ์ธํ๊ธฐ ๋ ์ฌ์์ง๋๋ค.
๊ธ๋ก๋ฒ ํ๋ก์ ํธ์์ @export์ ์ฌ์ฉ ์ฌ๋ก
@export ๊ท์น์ ์ผ๊ด์ฑ, ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ์ด ์ค์ํ ๋๊ท๋ชจ ๊ธ๋ก๋ฒ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ์ ํนํ ์ ์ฉํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค:
- ๋์์ธ ์์คํ
: ๋์์ธ ์์คํ
์ ๊ตฌ์ถํ๋ ํ์ ๊ฒฝ์ฐ,
@export๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ ํธ, ํ์ดํฌ๊ทธ๋ํผ ์ค์ผ์ผ, ๊ฐ๊ฒฉ ๋จ์์ ๊ฐ์ ํต์ฌ ์คํ์ผ ์์น์ ์ ์ํ๊ณ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์ด๋ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ณ ์์คํ ์ ์ง ๊ด๋ฆฌ์ ํ์ํ ๋ ธ๋ ฅ์ ์ค์ฌ์ค๋๋ค. - ๋ค์ค ํ
๋ง ์ ํ๋ฆฌ์ผ์ด์
: ์ฌ๋ฌ ํ
๋ง๋ฅผ ์ง์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์
@export๋ฅผ ํ์ฉํ์ฌ ํ ๋ง๋ณ ๋ณ์์ ์คํ์ผ์ ์ ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ํ ๋ง ๊ฐ์ ์ ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ผ์ดํธ ํ ๋ง์ ๋คํฌ ํ ๋ง ์ค์์ ์ ํํ ์ ์๋ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๊ณ์ ๋ณ๋ก ๋ค๋ฅธ ํ ๋ง๋ฅผ ์ ๊ณตํ๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. - ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ด๋ถ ๋๋ ์ธ๋ถ์ฉ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ ๋,
@export๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ์คํ์ผ ํํฌ๋ฅผ ๋ ธ์ถํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ํต์ฌ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปดํฌ๋ํธ๋ฅผ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธ๋ก๋ฒ ๊ธฐ์ ์ฉ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ๋ฒํผ ๋ฐ ๊ธฐํ ์ํธ์์ฉ ์์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์์์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก ํ์ฉํ ์ ์์ต๋๋ค. - ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(L10n):
@export๋ ์ฌ์ฉ์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์คํ์ผ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์ ๋ฐ๋๊ฐ ๋ค๋ฅธ ์ธ์ด์ ๋ํด ๋ค๋ฅธ ๊ธ๊ผด ํฌ๊ธฐ๋ ๊ฐ๊ฒฉ ๊ฐ์ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. ์์ด์ ์ผ๋ณธ์ด ์ฌ์ฉ์๋ฅผ ๋ชจ๋ ๋์์ผ๋ก ํ๋ ์น์ฌ์ดํธ๋ ๋ค๋ฅธ ๋ฌธ์ ๋๋น๋ฅผ ์์ฉํ๊ธฐ ์ํด ๊ธ๊ผด ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค. - A/B ํ
์คํธ: ๋ค๋ฅธ ์น์ฌ์ดํธ ๋์์ธ์ ๋ํ A/B ํ
์คํธ๋ฅผ ์คํํ ๋,
@export๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ ๋ณ๋์ ์คํ์ผ ๋ณํ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด CSS์ ๋ง์ ๋ถ๋ถ์ ๋ค์ ์์ฑํ์ง ์๊ณ ๋ ๋ค๋ฅธ ๋์์ธ์ ์ฑ๋ฅ์ ์ ์ํ๊ฒ ๋น๊ตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,@export๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ณํ์ ๋ํด ๋ค๋ฅธ ์ ๊ตฌ์ฑํ๋ ๋ฒํผ ์คํ์ผ์ ์ ์ํ ์ ์์ต๋๋ค.
@export ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
@export์ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์:
- ํ์ํ ๊ฒ๋ง ๋ด๋ณด๋ด๊ธฐ: ๋ถํ์ํ ์คํ์ผ์ด๋ ๊ฐ์ ๋ด๋ณด๋ด์ง ๋ง์ธ์. ๋ค๋ฅธ ๋ชจ๋์์ ์ ๋ง๋ก ํ์ํ ๊ฒ๋ง ๋ด๋ณด๋ด์ผ ํฉ๋๋ค. ์ด๋ ๋ชจ๋์ ์ง์ค๋๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ค๋ช
์ ์ธ ์ด๋ฆ ์ฌ์ฉ: ๋ด๋ณด๋ด๋ ๋ณ์์ ํด๋์ค ์ด๋ฆ์ ๋ช
ํํ๊ณ ์ค๋ช
์ ์ธ ์ด๋ฆ์ ์ ํํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ด๋ณด๋ธ ๊ฐ์ด ๋ฌด์์ ๋ํ๋ด๋์ง ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
color1์ด๋ผ๋ ๋ณ์๋ฅผ ๋ด๋ณด๋ด๋ ๋์primaryColor๋๋brandColor๋ฅผ ์ฌ์ฉํ์ธ์. - ๋ด๋ณด๋ด๊ธฐ ๋ฌธ์ํ: ๋ด๋ณด๋ด๋ ๋ณ์์ ํด๋์ค ์ด๋ฆ์ ๋ํด ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ๋ ๋ช ํํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ด๋ณด๋ธ ๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. JSDoc์ด๋ Styleguidist์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ CSS ์คํ์ผ ๋ชจ๋์ ๋ํ ๋ฌธ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์ผ๊ด๋ ์คํ์ผ ๊ฐ์ด๋ ์ ์ง: ๋ช
๋ช
๊ท์น ๋ฐ
@export์ฌ์ฉ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํฌํจํ์ฌ CSS ์คํ์ผ ๋ชจ๋์ ๋ํ ์ผ๊ด๋ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ์๋ฆฝํ์ธ์. ์ด๋ ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์์ ์ผ๊ด์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. - ๊ณผ๋ํ ์ถ์ํ ํผํ๊ธฐ:
@export๊ฐ ์ฌ์ฌ์ฉ์ฑ์ ์ด์งํ ์ ์์ง๋ง, ์คํ์ผ์ ๊ณผ๋ํ๊ฒ ์ถ์ํํ์ง ๋ง์ธ์. ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ค์ ๋ก ๊ณต์ ๋๋ ๊ฐ๋ง ๋ด๋ณด๋ด์ผ ํฉ๋๋ค.
์ ํ ์ฌํญ ๋ฐ ๊ณ ๋ ค ์ฌํญ
@export๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๊ทธ ์ ํ ์ฌํญ๊ณผ ๊ณ ๋ ค ์ฌํญ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ:
@export๋ CSS ์คํ์ผ ๋ชจ๋์ ํนํ๋์ด ์์ผ๋ฉฐ CSS ๋ชจ๋์ ์ง์ํ๋ ๋น๋ ๋๊ตฌ(์: Webpack ๋๋ Parcel)๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ CSS ๊ธฐ๋ฅ์ด ์๋๋ฉฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ ์์ด๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ์ง ์์ต๋๋ค. - ๋ณต์ก์ฑ ์ฆ๊ฐ:
@export๋ฅผ ์ฌ์ฉํ๋ฉด ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ CSS ์ํคํ ์ฒ์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค.@export์ฌ์ฉ์ ์ด์ ์ด ์ถ๊ฐ๋ ๋ณต์ก์ฑ์ ๋ฅ๊ฐํ๋์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. - ํ์ต ๊ณก์ : CSS ์คํ์ผ ๋ชจ๋๊ณผ
@export์ ์ต์ํ์ง ์์ ๊ฐ๋ฐ์๋ ํ์ต ๊ณก์ ์ ์ง๋ฉดํ ์ ์์ต๋๋ค. ํ์ด ์ด๋ฌํ ๊ธฐ์ ์ ํจ๊ณผ์ ์ผ๋ก ์ฑํํ ์ ์๋๋ก ์ ์ ํ ๊ต์ก๊ณผ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์.
@export์ ๋์
@export๊ฐ CSS ๋ชจ๋์์ ๊ฐ์ ๊ณต์ ํ๋ ํ์ค ๋ฐฉ๋ฒ์ด์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์กด์ฌํฉ๋๋ค:
- CSS ๋ณ์(์ฌ์ฉ์ ์ง์ ์์ฑ):
@export๊ฐ ์ข ์ข CSS ๋ณ์์ ํจ๊ป *์ฌ์ฉ*๋์ง๋ง, ๋ณ์ ์์ฒด๋ ์ ์ญ ์คํ์ผ์ํธ๋ CSS ๋ชจ๋ ๋ด์:root๋ธ๋ก์ ์ ์๋ ์ ์์ผ๋ฏ๋ก@export์์ด๋ ์ ์ฌ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ CSS ๋ชจ๋์ด ์ ๊ณตํ๋ ์บก์ํ๋ฅผ ๊ฐ์์ํต๋๋ค. - CSS-in-JS ์๋ฃจ์ : Styled Components, Emotion, JSS์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ CSS๋ฅผ ๊ด๋ฆฌํ๋ ๋์์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ข ์ข ์ปดํฌ๋ํธ ๊ฐ์ ์คํ์ผ๊ณผ ๊ฐ์ ๊ณต์ ํ๊ธฐ ์ํ ์์ฒด ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค.
- Sass/SCSS ๋ณ์ ๋ฐ ๋ฏน์ค์ธ: Sass๋ SCSS์ ๊ฐ์ CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ณ์์ ๋ฏน์ค์ธ์ ์ฌ์ฉํ์ฌ ํ์ผ ๊ฐ์ ์คํ์ผ์ ๊ณต์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ CSS ์คํ์ผ ๋ชจ๋๊ณผ ๋์ผํ ์์ค์ ์บก์ํ๋ฅผ ์ ๊ณตํ์ง๋ ์์ต๋๋ค.
์์ : ๊ธ๋ก๋ฒ ๋ธ๋๋ฉ ์ ํ๋ฆฌ์ผ์ด์
๋ค๋ฅธ ์ง์ญ๊ณผ ์ธ์ด์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ ๊ธ๋ก๋ฒ ๋ธ๋๋ฉ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์
์ CSS ๋ชจ๋๊ณผ @export๋ฅผ ์ฌ์ฉํ์ฌ ํต์ฌ ์คํ์ผ์ ๊ด๋ฆฌํฉ๋๋ค:
/* core-variables.module.css */
:root {
--brand-primary: #29abe2; /* A light blue */
--brand-secondary: #f26522; /* An orange */
--base-font-family: 'Open Sans', sans-serif;
}
@export {
brandPrimary: var(--brand-primary);
brandSecondary: var(--brand-secondary);
baseFontFamily: var(--base-font-family);
}
/* typography.module.css */
@import core from './core-variables.module.css';
.heading {
font-family: core.baseFontFamily;
font-weight: bold;
color: core.brandPrimary;
}
.paragraph {
font-family: core.baseFontFamily;
font-size: 16px;
line-height: 1.5;
}
@export {
heading: heading;
paragraph: paragraph;
}
/* button.module.css */
@import core from './core-variables.module.css';
@import typography from './typography.module.css';
.button {
font-family: core.baseFontFamily;
background-color: core.brandPrimary;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
}
์ด ์์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
core-variables.module.css๋ ํต์ฌ ๋ธ๋๋ ์์๊ณผ ๊ธ๊ผด ํจ๋ฐ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.typography.module.css๋ ํต์ฌ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ชฉ๊ณผ ๋จ๋ฝ์ ์คํ์ผ์ ์ง์ ํ๊ณ ์ด๋ฌํ ์คํ์ผ์ ๋ด๋ณด๋ ๋๋ค.button.module.css๋ ํต์ฌ ๋ณ์์ ํ์ดํฌ๊ทธ๋ํผ ์คํ์ผ์ ๋ชจ๋ ๊ฐ์ ธ์ ๋ฒํผ ์คํ์ผ์ ์ผ๊ด๋๊ฒ ์ง์ ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ธ๋๋ฉ์ด ๋ชจ๋ ์ง์ญ๊ณผ ์ธ์ด์ ๊ฑธ์ณ ์ผ๊ด๋๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํ๋ ๋์์ ์ฌ์ด ์ฌ์ฉ์ ์ ์ ๋ฐ ํ ๋ง ์ค์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๊ฒฐ๋ก
@export ๊ท์น์ CSS ์คํ์ผ ๋ชจ๋์์ ์คํ์ผ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. ํ ๋ชจ๋์์ ๋ค๋ฅธ ๋ชจ๋๋ก ํน์ ๊ฐ์ ๋ช
์์ ์ผ๋ก ๋
ธ์ถํ ์ ์๊ฒ ํจ์ผ๋ก์จ CSS ์ฝ๋๋ฒ ์ด์ค์ ๋ชจ๋์ฑ, ์ฌ์ฌ์ฉ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ์ ์ด์งํฉ๋๋ค. ๋น๋ ํ๋ก์ธ์ค๊ฐ ํ์ํ๊ณ ์ฝ๊ฐ์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋์ง๋ง, ํนํ ๋๊ท๋ชจ ๊ธ๋ก๋ฒ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ์์๋ @export ์ฌ์ฉ์ ์ด์ ์ด ๋จ์ ์ ๋ฅ๊ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช
ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด @export๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ์ ์ ๋ฆฌ๋๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ CSS ์ํคํ
์ฒ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.